/***************************************************************************
 *   Copyright (C) 2007 by Grzegorz Latarowski, Maciej Gajewski            *
 *   g.latarowski@gmail.com                                                *
 *   maciej.gajewski0@gmail.com                                            *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/



// local
#include "gspinboxdelegate.h"



// ===========================================================================
//                              GSpinBoxDelegate
// ===========================================================================




// --------------- GSpinBoxDelegate::GSpinBoxDelegate() ----------------------
GSpinBoxDelegate::GSpinBoxDelegate( QObject * pParent )
    : GItemDelegate( pParent )
{
}
// ---------------------------------------------------------------------------


// --------------- GSpinBoxDelegate::createEditor() --------------------------
QWidget * GSpinBoxDelegate::createEditor( QWidget * pParent,
										  const QStyleOptionViewItem & option,
										  const QModelIndex & index
										) const
{
	Q_UNUSED( option );
	Q_UNUSED( index );
	
    QSpinBox * pEditor = new QSpinBox( pParent );
	
	pEditor->setSingleStep( _singleStep );
	pEditor->setRange( _minimum, _maximum );
	pEditor->setSuffix( _suffix );
	pEditor->setPrefix( _prefix );

	// connect spinbox to 'spinboxChanged' handler
	connect( pEditor, SIGNAL( valueChanged( int ) ), SLOT( spinboxChanged() ) );
    
    return pEditor;
}
// ---------------------------------------------------------------------------


// --------------- GSpinBoxDelegate::setEditorData() -------------------------
void GSpinBoxDelegate::setEditorData( QWidget * pEditor,
									  const QModelIndex & index
									) const
{
    int value = index.model()->data( index, Qt::UserRole ).toInt();

    QSpinBox * pSpinBox = qobject_cast< QSpinBox * >( pEditor );
	
	if( pSpinBox )
	{
		pSpinBox->setValue( value );
	}
}
// ---------------------------------------------------------------------------


// --------------- GSpinBoxDelegate::setModelData() --------------------------
void GSpinBoxDelegate::setModelData( QWidget * pEditor,
									 QAbstractItemModel * pModel,
									 const QModelIndex & index
								   ) const
{
    QSpinBox * pSpinBox = qobject_cast< QSpinBox * >( pEditor );
	if( pSpinBox )
	{
		pSpinBox->interpretText();
		int value = pSpinBox->value();
	
		pModel->setData( index, value, Qt::UserRole );
		pModel->setData( index, value, Qt::DisplayRole );
	}
}
// ---------------------------------------------------------------------------
/// Commits data to model on each spinbox change. Without thjis, data would be commited on leaving editor
void GSpinBoxDelegate::spinboxChanged()
{
	
	QSpinBox* pWidget = qobject_cast<QSpinBox*>( sender() );
	if ( pWidget )
	{
		// force data commit on each value change. Don't wait for widget to lost focus
		emit commitData( pWidget );
	}
}


// eof
